#include <stdio.h>
#include <stdlib.h>

// 前置声明
typedef struct Observer Observer;

// 主题（Subject）结构体
typedef struct {
    Observer** observers;  // 观察者列表
    int count;             // 当前观察者数量
    int capacity;          // 列表容量
    int temperature;       // 示例数据：温度
} TemperatureSensor;

// 观察者（Observer）结构体
struct Observer {
    void (*update)(struct Observer*, TemperatureSensor*);  // 回调函数
};

// 主题的注册函数：添加观察者
void register_observer(TemperatureSensor* sensor, Observer* obs) {
    if (sensor->count >= sensor->capacity) {
        sensor->capacity *= 2;
        sensor->observers = realloc(sensor->observers, sensor->capacity * sizeof(Observer*));
    }
    sensor->observers[sensor->count++] = obs;
}

// 主题的通知函数：触发所有观察者的更新
void notify_observers(TemperatureSensor* sensor) {
    for (int i = 0; i < sensor->count; i++) {
        sensor->observers[i]->update(sensor->observers[i], sensor);
    }
}

// 示例观察者：显示屏
typedef struct {
    Observer base;  // 必须包含基类Observer
    char name[20];
} Display;

// 显示屏的更新回调函数
void display_update(Observer* obs, TemperatureSensor* sensor) {
    Display* display = (Display*)obs;
    printf("[%s] 温度更新: %d°C\n", display->name, sensor->temperature);
}

// 初始化显示屏观察者
Display* create_display(const char* name) {
    Display* d = malloc(sizeof(Display));
    snprintf(d->name, sizeof(d->name), "%s", name);
    d->base.update = display_update;
    return d;
}

int main() {
    // 创建温度传感器（主题）
    TemperatureSensor sensor = {
        .observers = malloc(2 * sizeof(Observer*)),
        .count = 0,
        .capacity = 2,
        .temperature = 25
    };

    // 创建两个观察者（显示屏）
    Display* display1 = create_display("客厅屏幕");
    Display* display2 = create_display("卧室屏幕");

    // 注册观察者
    register_observer(&sensor, (Observer*)display1);
    register_observer(&sensor, (Observer*)display2);

    // 模拟温度变化并通知观察者
    sensor.temperature = 28;
    notify_observers(&sensor);

    // 释放资源（略：需实现free函数）

    return 0;
}